15. 解决方案:GROUP BY

解决方案:GROUP BY

根据 SQL 表格信息回答以下问题。如果你遇到问题或想要对比检查你的答案,可以在下一页面的顶部找到我的答案。

一个判断难点是,何时使用某个聚合函数或其他 SQL 功能最简单。请尝试回答以下问题,看看你能否找到最简单的解决方案。

  1. 哪个 客户 (按照名称)下的订单最早?你的答案应该包含订单的 客户名称 日期
SELECT a.name, o.occurred_at
FROM accounts a
JOIN orders o
ON a.id = o.account_id
ORDER BY occurred_at
LIMIT 1;
  1. 算出每个客户的总销售额(单位是 美元 )。答案应该包括两列:每个公司的订单总销售额(单位是 美元 )以及公司 名称
SELECT a.name, SUM(total_amt_usd) total_sales
FROM orders o
JOIN accounts a
ON a.id = o.account_id
GROUP BY a.name;
  1. 最近的 web_event 是通过哪个 渠道 发生的,与此 web_event 相关的 客户 是哪个?你的查询应该仅返回三个值: 日期 渠道 客户名称
SELECT w.occurred_at, w.channel, a.name
FROM web_events w
JOIN accounts a
ON w.account_id = a.id 
ORDER BY w.occurred_at DESC
LIMIT 1;
  1. 算出 web_events 中每种 渠道 的次数。最终表格应该有两列: 渠道 和渠道的使用次数。
SELECT w.channel, COUNT(*)
FROM web_events w
JOIN accounts a
ON a.id = w.account_id
GROUP BY w.channel
  1. 与最早的 web_event 相关的 主要联系人 是谁?
SELECT a.primary_poc
FROM web_events w
JOIN accounts a
ON a.id = w.account_id
ORDER BY w.occurred_at
LIMIT 1;
  1. 每个 客户 所下的最小订单是什么(以 总金额(美元) 为准)。答案只需两列:客户 名称 总金额(美元) 。从最小金额到最大金额排序。
SELECT a.name, MIN(total_amt_usd) smallest_order
FROM accounts a
JOIN orders o
ON a.id = o.account_id
GROUP BY a.name
ORDER BY smallest_order;

奇怪的是,很多订单没有美元金额。我们可能需要检查下这些订单。

  1. 算出每个区域的 销售代表 人数。最终表格应该包含两列: 区域 sales_reps 数量。从最少到最多的代表人数排序。
SELECT r.name, COUNT(*) num_reps
FROM region r
JOIN sales_reps s
ON r.id = s.region_id
GROUP BY r.name
ORDER BY num_reps;